home *** CD-ROM | disk | FTP | other *** search
/ QRZ! Ham Radio 1 / QRZ Ham Radio Callsign Database - December 1993.iso / ucsd / packet / tcpip / amiga / asrc29k.lha / smisc.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-01-08  |  4.6 KB  |  264 lines

  1. /* Miscellaneous servers */
  2. #include <stdio.h>
  3. #include "global.h"
  4. #include "mbuf.h"
  5. #include "socket.h"
  6. #include "proc.h"
  7. #include "remote.h"
  8. #include "smtp.h"
  9. #include "tcp.h"
  10. #include "commands.h"
  11. #include "hardware.h"
  12. #include "mailbox.h"
  13.  
  14. char *Rempass = "";    /* Remote access password */
  15.  
  16. static int chkrpass __ARGS((struct mbuf *bp));
  17. static void discserv __ARGS((int s,void *unused,void *p));
  18. static void echoserv __ARGS((int s,void *unused,void *p));
  19.  
  20. static int Rem = -1;
  21. static int Sdisc = -1;
  22. static int Secho = -1;
  23.  
  24. /* Start up TCP discard server */
  25. int
  26. dis1(argc,argv,p)
  27. int argc;
  28. char *argv[];
  29. void *p;
  30. {
  31.     struct sockaddr_in lsocket;
  32.     int s;
  33.  
  34.     if(Sdisc != -1){
  35.         freeargs(argc,argv);
  36.         return 0;
  37.     }
  38.     psignal(Curproc,0);     /* Don't keep the parser waiting */
  39.     chname(Curproc,"Discard listener");
  40.  
  41.     lsocket.sin_family = AF_INET;
  42.     lsocket.sin_addr.s_addr = INADDR_ANY;
  43.     if(argc < 2)
  44.         lsocket.sin_port = IPPORT_DISCARD;
  45.     else
  46.         lsocket.sin_port = atoi(argv[1]);
  47.     freeargs(argc,argv);
  48.     Sdisc = socket(AF_INET,SOCK_STREAM,0);
  49.     bind(Sdisc,(char *)&lsocket,sizeof(lsocket));
  50.     listen(Sdisc,1);
  51.     for(;;){
  52.         if((s = accept(Sdisc,NULLCHAR,(int *)NULL)) == -1)
  53.             break;    /* Service is shutting down */
  54.  
  55.         if(availmem() < Memthresh){
  56.             shutdown(s,1);
  57.         } else
  58.             /* Spawn a server */
  59.             newproc("Discard server",576,discserv,s,NULL,NULL);
  60.     }
  61.     return 0;
  62. }
  63.  
  64. static void
  65. discserv(s,unused,p)
  66. int s;
  67. void *unused;
  68. void *p;
  69. {
  70.     struct mbuf *bp;
  71.  
  72.     sockowner(s,Curproc);
  73.     mainlog(s,"open discard");
  74.     while(recv_mbuf(s,&bp,0,NULLCHAR,NULL) > 0)
  75.         free_p(bp);
  76.     mainlog(s,"close discard");
  77.     close_s(s);
  78. }
  79.  
  80. /* Stop discard server */
  81. int
  82. dis0(argc,argv,p)
  83. int argc;
  84. char *argv[];
  85. void *p;
  86. {
  87.     close_s(Sdisc);
  88.     Sdisc = -1;
  89.     return 0;
  90. }
  91.  
  92. /* Start up TCP echo server */
  93. int
  94. echo1(argc,argv,p)
  95. int argc;
  96. char *argv[];
  97. void *p;
  98. {
  99.     struct sockaddr_in lsocket;
  100.     int s;
  101.  
  102.     if(Secho != -1){
  103.         freeargs(argc,argv);
  104.         return 0;
  105.     }
  106.     psignal(Curproc,0);     /* Don't keep the parser waiting */
  107.     chname(Curproc,"Echo listener");
  108.  
  109.     lsocket.sin_family = AF_INET;
  110.     lsocket.sin_addr.s_addr = INADDR_ANY;
  111.     if(argc < 2)
  112.         lsocket.sin_port = IPPORT_ECHO;
  113.     else
  114.         lsocket.sin_port = atoi(argv[1]);
  115.     freeargs(argc,argv);
  116.     Secho = socket(AF_INET,SOCK_STREAM,0);
  117.     bind(Secho,(char *)&lsocket,sizeof(lsocket));
  118.     listen(Secho,1);
  119.     for(;;){
  120.         if((s = accept(Secho,NULLCHAR,(int *)NULL)) == -1)
  121.             break;    /* Service is shutting down */
  122.  
  123.         if(availmem() < Memthresh){
  124.             shutdown(s,1);
  125.         } else
  126.             /* Spawn a server */
  127.             newproc("Echo server",2048,echoserv,s,NULL,NULL);
  128.     }
  129.     return 0;
  130. }
  131.  
  132. static void
  133. echoserv(s,unused,p)
  134. int s;
  135. void *unused;
  136. void *p;
  137. {
  138.     struct mbuf *bp;
  139.  
  140.     sockowner(s,Curproc);
  141.     mainlog(s,"open echo");
  142.     while(recv_mbuf(s,&bp,0,NULLCHAR,NULL) > 0)
  143.         send_mbuf(s,bp,0,NULLCHAR,0);
  144.  
  145.     mainlog(s,"close echo");
  146.     close_s(s);
  147. }
  148.  
  149. /* stop echo server */
  150. int
  151. echo0(argc,argv,p)
  152. int argc;
  153. char *argv[];
  154. void *p;
  155. {
  156.     close_s(Secho);
  157.     Secho = -1;
  158.     return 0;
  159. }
  160.  
  161. /* Start remote exit/reboot server */
  162. int
  163. rem1(argc,argv,p)
  164. int argc;
  165. char *argv[];
  166. void *p;
  167. {
  168.     struct sockaddr_in lsocket,fsock;
  169.     int i;
  170.     char command;
  171.     struct mbuf *bp;
  172.     int32 addr;
  173.  
  174.     if(Rem != -1){
  175.         freeargs(argc,argv);
  176.         return 0;
  177.     }
  178.     psignal(Curproc,0);
  179.     chname(Curproc,"Remote listener");
  180.     lsocket.sin_family = AF_INET;
  181.     lsocket.sin_addr.s_addr = INADDR_ANY;
  182.     if(argc < 2)
  183.         lsocket.sin_port = IPPORT_REMOTE;
  184.     else
  185.         lsocket.sin_port = atoi(argv[1]);
  186.     
  187.     freeargs(argc,argv);
  188.     Rem = socket(AF_INET,SOCK_DGRAM,0);
  189.     bind(Rem,(char *)&lsocket,sizeof(lsocket));
  190.     for(;;){
  191.         i = sizeof(fsock);
  192.         if(recv_mbuf(Rem,&bp,0,(char *)&fsock,&i) == -1)
  193.             break;
  194.         command = pullchar(&bp);
  195.  
  196.         switch(uchar(command)){
  197. #ifdef    MSDOS    /* Only present on PCs running MSDOS */
  198.         case SYS_RESET:
  199.             i = chkrpass(bp);
  200.             mainlog(Rem,"%s - Remote reset %s",
  201.              psocket((struct sockaddr *)&fsock),
  202.              i == 0 ? "PASSWORD FAIL" : "" );
  203.             if(i != 0){
  204.                 iostop();
  205.                 sysreset();    /* No return */
  206.             }
  207.             break;
  208. #endif
  209.         case SYS_EXIT:
  210.             i = chkrpass(bp);
  211.             mainlog(Rem,"%s - Remote exit %s",
  212.              psocket((struct sockaddr *)&fsock),
  213.              i == 0 ? "PASSWORD FAIL" : "" );
  214.             if(i != 0){
  215.                 iostop();
  216.                 exit(0);
  217.             }
  218.             break;
  219.         case KICK_ME:
  220.             if(len_p(bp) >= sizeof(int32))
  221.                 addr = pull32(&bp);
  222.             else
  223.                 addr = fsock.sin_addr.s_addr;
  224.             kick(addr);
  225.             smtptick((void *)addr);
  226.             break;
  227.         }
  228.         free_p(bp);
  229.     }
  230.     close_s(Rem);
  231.     Rem = -1;
  232.     return 0;
  233. }
  234.  
  235. /* Check remote password */
  236. static int
  237. chkrpass(bp)
  238. struct mbuf *bp;
  239. {
  240.     char *lbuf;
  241.     int16 len;
  242.     int rval = 0;
  243.  
  244.     len = len_p(bp);
  245.     if(strlen(Rempass) != len)
  246.         return rval;
  247.     lbuf = mallocw(len);
  248.     pullup(&bp,lbuf,len);
  249.     if(strncmp(Rempass,lbuf,len) == 0)
  250.         rval = 1;
  251.     free(lbuf);
  252.     return rval;
  253. }
  254.  
  255. int
  256. rem0(argc,argv,p)
  257. int argc;
  258. char *argv[];
  259. void *p;
  260. {
  261.     close_s(Rem);
  262.     return 0;
  263. }
  264.